# ============================================================================
# 非线性钢筋混凝土GPU求解器测试 - PlasticDamageConcrete3d
# ============================================================================

wipe
puts "非线性混凝土GPU求解器测试 (PlasticDamageConcrete3d)"

model basic -ndm 2 -ndf 2

# ============================================================================
# 简单测试模型: 单个Quad单元
# ============================================================================

set L 1.0
node 1 0.0 0.0
node 2 $L  0.0
node 3 $L  $L
node 4 0.0 $L

# ============================================================================
# 塑性损伤混凝土材料 (PlasticDamageConcrete3d)
# ============================================================================

# C30混凝土参数:
# E  = 30 GPa (弹性模量)
# nu = 0.2 (泊松比)
# ft = 3 MPa (抗拉强度)
# fc = 30 MPa (抗压强度)
# beta = 0.6 (塑性流动参数)
# Ap = 0.5 (拉伸损伤参数)
# An = 2.0 (压缩损伤参数)
# Bn = 0.75 (压缩损伤指数)

nDMaterial PlasticDamageConcrete3d 1 30.0e9 0.2 3.0e6 30.0e6 0.6 0.5 2.0 0.75

puts "定义材料: PlasticDamageConcrete3d"
puts "  E=30 GPa, nu=0.2"
puts "  ft=3 MPa, fc=30 MPa"
puts "  beta=0.6, Ap=0.5, An=2.0, Bn=0.75"

# ============================================================================
# 创建Quad单元
# ============================================================================

set thickness 0.2
element quad 1 1 2 3 4 $thickness "PlaneStress" 1

puts "创建Quad单元, 厚度=${thickness}m"

# ============================================================================
# 边界条件
# ============================================================================

# 底部两个节点完全固定
fix 1 1 1
fix 2 1 1

# 顶部两个节点: X固定，Y自由
fix 3 1 0
fix 4 1 0

# 顶部节点施加竖向载荷 (压缩)
pattern Plain 1 Linear {
    # 施加小载荷（1 kN），避免材料进入严重非线性
    load 3 0.0 -500.0
    load 4 0.0 -500.0
}

# ============================================================================
# GPU求解器测试
# ============================================================================

puts "\n=== GPU求解器测试 (启用调试输出) ==="

constraints Plain
numberer Plain
system GPUSolver -debugLevel 2 -enableModule all
test NormDispIncr 1.0e-6 10
algorithm Newton
integrator LoadControl 0.1

analysis Static

puts "\n运行GPU非线性分析 (10步，每步0.1)..."

# 逐步施加载荷
set numSteps 10
set ok 0

for {set i 1} {$i <= $numSteps} {incr i} {
    puts "\n--- Step $i/$numSteps ---"
    set ok [analyze 1]

    if {$ok != 0} {
        puts "❌ 分析在第${i}步失败"
        break
    }

    # 输出当前位移
    set disp3y [nodeDisp 3 2]
    puts "节点3 Y位移: $disp3y m"
}

if {$ok == 0} {
    puts "\n✓ GPU非线性分析成功完成 $numSteps 步"
    puts "最终节点3位移: [nodeDisp 3 1] [nodeDisp 3 2]"
    puts "最终节点4位移: [nodeDisp 4 1] [nodeDisp 4 2]"
} else {
    puts "\n❌ GPU非线性分析失败"
}

# ============================================================================
# 检查GPU调试输出
# ============================================================================

puts "\n=========================================="
puts "检查GPU调试输出 (上方):"
puts "=========================================="
puts "应该看到:"
puts "  \[GPUMaterialExtractor\] Quad\[1\] PlasticDamageConcrete3d:"
puts "    E=3e+10, nu=0.2, ft=3e+06, fc=3e+07"
puts "    beta=0.6, Ap=0.5, An=2.0, Bn=0.75"
puts ""
puts "  \[MEMORY_MANAGEMENT\] Allocating nonlinear material state variables"
puts "  \[MEMORY_MANAGEMENT\] Allocated d_materialStates: ... bytes"
puts "  \[MEMORY_MANAGEMENT\] Allocated d_strainTotal: ... bytes"
puts ""
puts "如果看到这些输出, 说明:"
puts "  1. PlasticDamageConcrete3d参数成功提取"
puts "  2. GPU材料状态内存成功分配"
puts "  3. 非线性材料本构GPU计算就绪"
puts "=========================================="

wipe
